import os
import requests
import fitz  # 引入PyMuPDF模块
from PIL import Image, ExifTags
import io

def download_image(file_url, filepath):
    """
    下载图像并保存到指定路径，返回文件名（包含扩展名）。

    参数:
    file_url (str): 图像的 URL。
    filepath (str): 要保存的文件路径（可以没有扩展名）。

    返回:
    str: 包含扩展名的文件名。
    """
    if len(file_url) > 0:
        try:
            # 发送请求
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
                'Referer': 'https://pyweb.marisfrolg-data.xyz',
                'Accept-Language': 'en-US,en;q=0.5'
            }
            r = requests.get(file_url, headers=headers)
            r.raise_for_status()  # 检查请求是否成功

            # 检查图片内容是否有效（保留原有逻辑）
            if len(r.content) <= 10:
                return f"下载的图像内容为空", None

            # 获取内容类型
            content_type = r.headers.get('Content-Type')

            # 根据内容类型确定扩展名
            extension = ''
            if content_type == 'image/jpeg':
                extension = '.jpg'
            elif content_type == 'image/png':
                extension = '.png'
            elif content_type == 'image/gif':
                extension = '.gif'
            elif content_type == 'image/bmp':
                extension = '.bmp'
            elif content_type == 'image/webp':
                extension = '.webp'
            else:
                extension = '.jpg'  # 如果无法确定格式，使用默认扩展名
                print(f"未知的图片格式: {content_type}")

            # 如果没有扩展名，则添加
            if not os.path.splitext(filepath)[1] and extension:
                filepath += extension

            # 使用 PIL 处理图片方向（仅在内容有效时执行）
            img = Image.open(io.BytesIO(r.content))

            # 检查 EXIF 方向信息（仅 JPEG 支持）
            if hasattr(img, '_getexif'):
                exif = img._getexif()
                if exif is not None:
                    for orientation in ExifTags.TAGS.keys():
                        if ExifTags.TAGS[orientation] == 'Orientation':
                            break
                    if orientation in exif:
                        # 根据 EXIF 方向旋转图片
                        if exif[orientation] == 3:
                            img = img.rotate(180, expand=True)
                        elif exif[orientation] == 6:
                            img = img.rotate(270, expand=True)
                        elif exif[orientation] == 8:
                            img = img.rotate(90, expand=True)

            # 保存图像
            img.save(filepath)
            print(f"图像已保存为: {filepath}")

            return None, filepath

        except requests.exceptions.RequestException as e:
            return f"请求失败: {e}", None
        except Exception as e:
            return f"保存图像时出错: {e}", None

    return f"请求失败", None

# 只返回最多3页,且只返回识别到的第一张发票
def pdf_to_jpg(pdf_path, zoom=2, dpi=150):# zoom为1时服务器图片变模糊
    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)

    # 获取原始文件名和目录
    base_name = os.path.splitext(os.path.basename(pdf_path))[0]
    output_folder = os.path.dirname(pdf_path)

    file_list = []
    # 遍历每一页
    for page_num in range(len(pdf_document)):
        page = pdf_document.load_page(page_num)
        # 只管前2页
        if len(file_list) > 2:
            file_list.append(None)
            continue
        # 设置缩放因子
        matrix = fitz.Matrix(zoom, zoom)  # 默认zoom=1.0表示不缩放
        # pixmap = page.get_pixmap(matrix=matrix, dpi=dpi) # 服务器图片变模糊
        pixmap = page.get_pixmap(matrix=matrix)

        # 保存为JPG文件
        output_path = os.path.join(output_folder, f"{base_name}_page_{page_num + 1}.jpg")
        pixmap.save(output_path)
        file_list.append(output_path)
    return file_list

